package pers.wwz.study.tencentcop.controller;

import com.alibaba.fastjson.JSON;
import org.apache.el.lang.ELArithmetic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import pers.wwz.study.tencentcop.response.AccessTokenResponse;
import pers.wwz.study.tencentcop.utils.MyCache;

import javax.annotation.PostConstruct;

@RestController
public class AccessTokenController {

    @Autowired
    RestTemplate restTemplate;


    @Value("${tencent.accessTokenUrl}")
    private String accessTokenUrl;

    /**
     * 获取accessToken
     *
     * 加注解:@PostConstruct的作用是当AccessTokenController生成的时候就去获取一次accessToken
     *
     *
     * 开发者需要缓存access_token，用于后续接口的调用（注意：不能频繁调用gettoken接口，否则会受到频率拦截）。当access_token失效或过期时，需要重新获取。
     *
     * access_token的有效期通过返回的expires_in来传达，正常情况下为7200秒（2小时），有效期内重复获取返回相同结果，过期后获取会返回新的access_token。
     * 由于企业微信每个应用的access_token是彼此独立的，所以进行缓存时需要区分应用来进行存储。
     * access_token至少保留512字节的存储空间。
     * 企业微信可能会出于运营需要，提前使access_token失效，开发者应实现access_token失效时重新获取的逻辑。
     * @return
     */
    @PostConstruct
    @PostMapping(value = "/getAccessToken",produces = {"applicatiom/json"})
    public String getAccessToken(){
        String accessToken = (String)MyCache.get("accessToken");
        if(!StringUtils.isEmpty(accessToken)){
            return accessToken;
        } else {
            String responseJson = restTemplate.getForObject(accessTokenUrl,String.class);
            AccessTokenResponse accessTokenResponse = JSON.parseObject(responseJson, AccessTokenResponse.class);
            // 缓存accessToken,有效期两个小时
            MyCache.put("accessToken",accessTokenResponse.getAccess_token(),2*60*60*1000);
            return accessTokenResponse.getAccess_token();
        }

    }
}
